์ฐธ๊ณ :
https://supabase.com/docs/guides/database/database-advisors?queryGroups=lint&lint=0011_function_search_path_mutable
์์ธ
In PostgreSQL, the
search_path
determines the order in which schemas are searched to find unqualified objects (like tables, functions, etc.)
search_path
๋ํ
์ด๋ธ๊ณผ ํจ์๊ฐ์ unqualified objects๋ค์ ์ฐพ์๋ ์ด๋ค ์คํค๋ง์์ ์ฐพ์์ง ์ค์ ํ๋๊ฒ์ด๋ผ๊ณ ํ๋ค. ์ฌ์ฉ์์ ๊ธฐ๋ณธ search_path
๊ฐ ์๋ค๊ณ ํด๋ ํจ์๋ฅผ ๋ง๋ค๋ ๋ฐ๋ก ์์ฑํ๋๊ฒ์ ๊ถ์ฅํ๋ค๊ณ ํ๋ค.
Search Path๋?
profiles
๋ผ๋ unqualified object(ํ
์ด๋ธ, ํจ์ ๋ฑ)๊ฐ ์๊ณ (public.profiles
์ฒ๋ผ ์์ ์คํค๋ง์ ์ด๋ฆ๊น์ง ์์ฑํ๋ฉด qualified object๊ฐ ๋๋ค.) ์ด๊ฑธ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ์ฐธ๊ณ ํ ์คํค๋ง์ ์ด๋ฆ๋ค์ด ์ ํ ๋ฆฌ์คํธ๊ฐ search_path
๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก search_path
๋ ์ฌ์ฉ์์ ์คํค๋ง์ public ์คํค๋ง๋ฅผ ๋ด๊ณ ์๋ค. ๊ทธ๋ฌ๋ ๋ง์ผ์ ๊ฒฝ์ฐ์ ๋๋นํด search_path
๋ฅผ ํน์ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข๋ค๊ณ ํ๋๋ฐ, ์๋ํ๋ฉด ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์๋ง๋ค ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ๋ค์ด ์ด๋ค ํจ์ example_function()
์์ profiles
ํ
์ด๋ธ์์ ์๋ฃ๋ฅผ ๊ฐ์ ธ์ ๋ฐํํ๋๋ฐ search_path
๊ฐ ํน์ ๋์ด์์ง ์์๋ค๊ณ ํ๋ค๋ฉด, sales
์คํค๋ง์ ์ํ ์ฌ์ฉ์๊ฐ ํจ์๋ฅผ ํธ์ถํ ๋์ develpoment
์คํค๋ง์ ์ํ ์ฌ์ฉ์๊ฐ ํจ์๋ฅผ ํธ์ถํ ๋ example_function()
์ ๊ฐ๊ฐ ์ฌ์ฉ์๋ค์ด ์ํ ์คํค๋ง์ profiles
ํ
์ด๋ธ์ ์ฐธ๊ณ ํ๊ฒ ๋๋ค.(๋ ์คํค๋ง ๋ชจ๋ profiles
๋ผ๋ ํ
์ด๋ธ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด)
ํด๊ฒฐ
ํจ์๋ฅผ ๋ง๋ค ๋ DDL์ ๋ค์๊ณผ ๊ฐ์ ์ค์ ์ ์ถ๊ฐํ๋ค.
create or replace function example_function()
returns void
language sql
set search_path = '' -- ์ฌ๊ธฐ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
as $$
....
$$;
๋น ๋ฌธ์์ด๋ก ์ค์ ํ๊ธฐ
์ํ๋ฒ ์ด์ค๋ ํนํ search_path = ''
๋ก ์ค์ ํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค๊ณ ํ๋ค.
๋น ๋ฌธ์์ด๋ก ์ค์ ํ๋ฉด search_path
๋ฅผ ์ฌ์ค์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด๊ณ ,
ํจ์ ๋ด๋ถ์์ ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ๋ unqualified์ธ ์ํ๋ก ์ฐธ์กฐํ์ง ๋ชปํ๊ณ ๋ฐ๋์ ์คํค๋ง ๋ช
์ ๋ช
์ํ qualified ์ํ(schema.object
)๋ก ์ฐธ์กฐํด์ผํ๊ธฐ ๋๋ฌธ์ ์คํค๋ง ์ด๋ฆ์ ๋ช
์ํด์ผํ๋ค.
์คํค๋ง๋ช
์ ๋ช
์ํด์ผ๋๊ธฐ ๋๋ฌธ์ ํตํด ์์ธก ๋ถ๊ฐ๋ฅํ ๋์undexpected behavior์ ๋ฐฉ์งํ๊ณ , ๋ณด์ ์ทจ์ฝ์ฑsecurity vulnerabilities์ ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ถ์ฅํ๋ค๊ณ .
๋ช
ํ์ฑ, ์ผ๊ด์ฑ, ๋ณด์์ฑ์ ๋์ด๊ธฐ ์ํ ๋ฐฉ์ด์ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ฐฉ๋ฒ.